home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / ODF Release 3 / ODFDev / ODF / Found / FWRefCnt / FWCouPtr.h < prev    next >
Encoding:
Text File  |  1996-12-16  |  6.1 KB  |  207 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWCouPtr.h
  4. //    Release Version:    $ ODF 3 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #ifndef FWCOUPTR_H
  11. #define FWCOUPTR_H
  12.  
  13. #ifndef FWEXCLIB_H
  14. #include "FWExcLib.h"
  15. #endif
  16.  
  17. //========================================================================================
  18. // CLASS FW_TCountedPtr<tRep>
  19. //========================================================================================
  20.  
  21. template <class tRep>
  22. class FW_TCountedPtr
  23. {
  24. public:
  25.     FW_DECLARE_AUTO(FW_TCountedPtr<tRep>)
  26.  
  27.     ~FW_TCountedPtr();
  28.         // Destroy the pointer.  
  29.         // Decrements the count in the rep, and deletes the rep if count is zero.
  30.         
  31.     FW_TCountedPtr();
  32.         // Creates a "NULL" pointer.
  33.  
  34.     FW_TCountedPtr(const FW_TCountedPtr<tRep>& other);
  35.         // Point this pointer to the same rep as the other pointer points to.
  36.  
  37.     FW_TCountedPtr(tRep* rep);
  38.         // Creates a pointer pointing at rep.
  39.     
  40.     FW_TCountedPtr<tRep>& operator=(const FW_TCountedPtr<tRep>& other);
  41.         // Assignment, point this ponter to the same rep as the other pointer points to.
  42.         
  43.     FW_TCountedPtr<tRep>& operator=(tRep* rep);
  44.         // Assignment, point this ponter to rep.
  45.         
  46.     tRep* operator->() const { FW_ASSERT(fRep != NULL); return fRep; }
  47.         // Provide access to members of rep.    
  48.         
  49.     tRep& operator*() const { FW_ASSERT(fRep != NULL); return *fRep; }
  50.         // Provide access to rep.
  51.         // This operator should be used only if operator->() is not sufficient.
  52.     
  53.     tRep* GetRep() const { return fRep; }
  54.         // Provide access to rep.
  55.         // This operator should be used only if operator->() is not sufficient.
  56.     
  57.     operator const void*() const;
  58.         // Use to test if this is a "NULL" pointer.
  59.  
  60. protected:
  61.     void    SetRep(tRep* rep);
  62.     
  63. protected:    
  64.     tRep *fRep;
  65. };
  66.  
  67. //----------------------------------------------------------------------------------------
  68. // FW_TCountedPtr<tRep>::FW_TCountedPtr
  69. //----------------------------------------------------------------------------------------
  70.  
  71. template <class tRep>
  72. inline FW_TCountedPtr<tRep>::FW_TCountedPtr() :
  73.     fRep(NULL)
  74. {
  75.     FW_END_CONSTRUCTOR
  76. }
  77.  
  78. //----------------------------------------------------------------------------------------
  79. // FW_TCountedPtr<tRep>::~FW_TCountedPtr
  80. //----------------------------------------------------------------------------------------
  81.  
  82. template <class tRep>
  83. inline FW_TCountedPtr<tRep>::~FW_TCountedPtr()
  84. {
  85.     FW_START_DESTRUCTOR
  86.     if (fRep && !fRep->DecrementReferenceCount()) delete fRep;
  87. }
  88.  
  89. //----------------------------------------------------------------------------------------
  90. // FW_TCountedPtr<tRep>::FW_TCountedPtr
  91. //----------------------------------------------------------------------------------------
  92.  
  93. template <class tRep>
  94. inline FW_TCountedPtr<tRep>::FW_TCountedPtr(const FW_TCountedPtr& other) :
  95.     fRep(other.fRep)
  96. {
  97.     if (fRep) fRep->IncrementReferenceCount();
  98.     FW_END_CONSTRUCTOR
  99. }
  100.  
  101. //----------------------------------------------------------------------------------------
  102. // FW_TCountedPtr<tRep>::FW_TCountedPtr
  103. //----------------------------------------------------------------------------------------
  104.  
  105. template <class tRep>
  106. inline FW_TCountedPtr<tRep>::FW_TCountedPtr(tRep* rep) :
  107.     fRep(rep)
  108. {
  109.     if (fRep) fRep->IncrementReferenceCount();
  110.     FW_END_CONSTRUCTOR
  111. }
  112.  
  113. //----------------------------------------------------------------------------------------
  114. // FW_TCountedPtr<tRep>::SetRep
  115. //----------------------------------------------------------------------------------------
  116.  
  117. template <class tRep>
  118. inline void FW_TCountedPtr<tRep>::SetRep(tRep* rep)
  119. {
  120.     if (fRep != rep)
  121.     {
  122.         if (fRep && !fRep->DecrementReferenceCount()) delete fRep;
  123.         fRep = rep;
  124.         if (fRep) fRep->IncrementReferenceCount();
  125.     }
  126. }
  127.         
  128. //----------------------------------------------------------------------------------------
  129. // FW_TCountedPtr<tRep>::operator=
  130. //----------------------------------------------------------------------------------------
  131.  
  132. template <class tRep>
  133. inline FW_TCountedPtr<tRep>& FW_TCountedPtr<tRep>::operator=(const FW_TCountedPtr<tRep>& other)
  134. {
  135.     SetRep(other.fRep);
  136.     return *this;
  137. }
  138.  
  139. //----------------------------------------------------------------------------------------
  140. // FW_TCountedPtr<tRep>::operator=
  141. //----------------------------------------------------------------------------------------
  142.  
  143. template <class tRep>
  144. inline FW_TCountedPtr<tRep>& FW_TCountedPtr<tRep>::operator=(tRep* rep)
  145. {
  146.     SetRep(rep);
  147.     return *this;
  148. }
  149.  
  150. //----------------------------------------------------------------------------------------
  151. // FW_TCountedPtr<tRep>::operator=
  152. //----------------------------------------------------------------------------------------
  153.  
  154. template <class tRep>
  155. inline FW_TCountedPtr<tRep>::operator const void*() const
  156. {
  157.     return fRep;
  158. }
  159.  
  160. //========================================================================================
  161. // CLASS FW_MCountedPtrRep
  162. //========================================================================================
  163.  
  164. class FW_MCountedPtrRep
  165. {
  166. public:
  167.         
  168.     FW_MCountedPtrRep();
  169.     virtual ~FW_MCountedPtrRep();
  170.  
  171.     long    IncrementReferenceCount();
  172.     long    DecrementReferenceCount();
  173.     long    GetReferenceCount();
  174.     
  175. private:
  176.     long     fRefCount;
  177. };
  178.  
  179. //----------------------------------------------------------------------------------------
  180. // FW_MCountedPtrRep::DecrementReferenceCount
  181. //----------------------------------------------------------------------------------------
  182.  
  183. inline long FW_MCountedPtrRep::DecrementReferenceCount()
  184. {
  185.     return --fRefCount;
  186. }
  187.  
  188. //----------------------------------------------------------------------------------------
  189. // FW_MCountedPtrRep::IncrementReferenceCount
  190. //----------------------------------------------------------------------------------------
  191.  
  192. inline long FW_MCountedPtrRep::IncrementReferenceCount()
  193. {
  194.     return ++fRefCount;
  195. }
  196.  
  197. //----------------------------------------------------------------------------------------
  198. // FW_MCountedPtrRep::GetReferenceCount
  199. //----------------------------------------------------------------------------------------
  200.  
  201. inline long FW_MCountedPtrRep::GetReferenceCount()
  202. {
  203.     return fRefCount;
  204. }
  205.  
  206. #endif
  207.